package com.maple.retry.retrytask;

import com.maple.retry.retrytask.model.RetryTaskInfo;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: maple
 * @version: RetryTaskResult.java, v 0.1 2020年12月02日 10:09 maple Exp $
 */
public class RetryTaskResult implements Serializable {

    private static final long serialVersionUID = 8835869623271753897L;

    protected boolean success;

    /**
     * 执行的重试任务列表
     */
    private List<RetryTaskInfo> retryTaskInfos;

    /**
     * 静态方法,返回成功的执行结果
     *
     * @return 成功的执行结果
     */
    public static RetryTaskResult valueOfSuccess() {
        return valueOfSuccess((RetryTaskInfo) null);
    }

    /**
     * 静态方法,返回成功的执行结果
     *
     * @param retryTaskInfos 补偿任务列表
     * @return 成功的执行结果
     */
    public static RetryTaskResult valueOfSuccess(List<RetryTaskInfo> retryTaskInfos) {

        RetryTaskResult result = new RetryTaskResult();

        result.setSuccess(true);

        result.setRetryTaskInfos(retryTaskInfos);

        return result;
    }

    /**
     * 静态方法,返回成功的执行结果
     *
     * @param retryTaskInfo 补偿任务
     * @return 成功的执行结果
     */
    public static RetryTaskResult valueOfSuccess(RetryTaskInfo retryTaskInfo) {

        RetryTaskResult result = new RetryTaskResult();

        result.setSuccess(true);

        if (null != retryTaskInfo) {
            List<RetryTaskInfo> taskInfos = new ArrayList<>();
            taskInfos.add(retryTaskInfo);
            result.setRetryTaskInfos(taskInfos);
        }

        return result;
    }

    /**
     * 构建默认失败结果
     *
     * @return 错误结果
     */
    public static RetryTaskResult valueOfError() {

        RetryTaskResult result = new RetryTaskResult();

        result.setSuccess(false);

        return result;
    }

    /**
     * 根据throwable创建结果
     *
     * @param e throwable
     * @return 错误结果
     */
    public static RetryTaskResult valueOfError(Throwable e) {

        RetryTaskResult result = new RetryTaskResult();

        result.setSuccess(false);

        return result;
    }

    /**
     * 在补偿任务列表只有一个任务的场景下,返回唯一的补偿任务
     *
     * <p>
     * 若列表长度大于1, 返回列表中第一个补偿任务
     * </p>
     *
     * @return 补偿任务
     */
    public RetryTaskInfo fetchSingleRetryTask() {
        if (CollectionUtils.isEmpty(retryTaskInfos)) {
            return null;
        }

        return retryTaskInfos.get(0);
    }

    public boolean isSuccess() {
        return this.success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }

    /**
     * Getter method for property retryTaskInfos.
     *
     * @return property value of retryTaskInfos
     */
    public List<RetryTaskInfo> getRetryTaskInfos() {
        return retryTaskInfos;
    }

    /**
     * Setter method for property retryTaskInfos.
     *
     * @param retryTaskInfos value to be assigned to property retryTaskInfos
     */
    public void setRetryTaskInfos(List<RetryTaskInfo> retryTaskInfos) {
        this.retryTaskInfos = retryTaskInfos;
    }
}
